
import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * 基于优先级堆的队列
 */
public class PriorityQueueTest {

    public static void main(String[] args){
        // ======== 创建一个优先队列，默认自然顺序
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();

        // ======== 添加元素，如果由于容量限制无法插入元素，则抛出 IllegalStateException 异常。
        minHeap.add(5);
        minHeap.add(1);
        minHeap.add(3);

        // ========  查看队列头部元素
        System.out.println("Head of the queue: " + minHeap.peek());

        // ======== 移除队列头部元素
        // 检索并移除此队列的头，如果此队列为空，则返回 null
        System.out.println("Removed: " + minHeap.poll());

        // 移除并返回队列中的头部元素；如果队列为空，则抛出 NoSuchElementException


        // ======== 查看队列剩余元素
        System.out.println("Queue: " + minHeap);

        // ======== 添加新的元素
        // 将指定的元素插入此优先级队列中，如果成功则返回 true。
        // 如果由于容量限制无法插入元素，则返回 false。通常情况下，PriorityQueue 没有固定的容量上限，所以这个方法几乎总是返回 true。
        minHeap.offer(2);
        minHeap.offer(4);

        // ======== 遍历队列
        System.out.println("PriorityQueue elements:");
        while (!minHeap.isEmpty()) {
            System.out.print(minHeap.poll() + ", ");  // 按优先级输出
        }

        // ======== 清空
        minHeap.clear();

        // 创建反过来的
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
        maxHeap.add(5);
        maxHeap.add(1);
        maxHeap.add(3);
        System.out.println("traverse max heap:");
        while (!maxHeap.isEmpty()) {
            System.out.print(maxHeap.poll() + ", ");  // 按优先级输出
        }
    }
}
